home *** CD-ROM | disk | FTP | other *** search
- // -------------------------------------------------------------------------------------
- // LargeImage.cxx
- // -------------------------------------------------------------------------------------
- // Permission is granted to freely redistribute this source code, and to use fragments
- // of this code in your own applications if you find them to be useful. This class,
- // along with the source code, come with no warranty of any kind, and the user assumes
- // all responsibility for its use.
- // -------------------------------------------------------------------------------------
-
- extern "Objective-C" {
- #import <objc/objc.h>
- #import <appkit/appkit.h>
- #import <libc.h>
- #import <stdlib.h>
- #import <stdio.h>
- #import <string.h>
- #import <math.h>
- #import <sys/time.h>
- #import <defaults/defaults.h>
- #import <dpsclient/psops.h>
- #import <dpsclient/dpsNeXT.h>
- }
-
- #import "ExpandImage.h"
- #import "ExpandedView.h"
-
- // -------------------------------------------------------------------------------------
- #define X origin.x
- #define Y origin.y
- #define W size.width
- #define H size.height
-
- // -------------------------------------------------------------------------------------
- @implementation ExpandImage
-
- // -------------------------------------------------------------------------------------
- // instance management
-
- /* init */
- - init
- {
- NXRect rect, controlRect, contentRect;
-
- /* init super */
- [super init];
-
- /* load nib */
- [NXApp loadNibSection:"ExpandImage.nib" owner:self];
- imageMenu = [imagePopup target];
- [[imageMenu setTarget:self] setAction:@selector(selectImageRep:)];
- [[useAlphaSw setTarget:self] setAction:@selector(selectImageRep:)];
-
- /* init window */
- [window setDelegate:self];
- [window getFrame:&rect];
- minWindowSize = rect.size;
- [Window getContentRect:&contentRect forFrameRect:&rect style:[window style]];
- minContentSize = contentRect.size;
-
- /* get control box height */
- [controlBox getFrame:&controlRect];
- controlHeight = controlRect.Y + controlRect.H;
-
- /* align imageScroller */
- [imageScroller getFrame:&rect];
- rect.X = 0.0;
- rect.Y = controlHeight;
- rect.W = minContentSize.width;
- rect.H = minContentSize.height - controlHeight;
- [imageScroller setFrame:&rect];
-
- return self;
- }
-
- /* free */
- - free
- {
- [window free];
- return [super free];
- }
-
- // -------------------------------------------------------------------------------------
- // show enlarged image
-
- /* clear image */
- - clearImage
- {
- [window orderOut:(id)nil];
- [imageView setImage:(id)nil :(char*)nil];
- return self;
- }
-
- /* show specified image */
- - showImage:theImage:(const char*)fileName title:(const char*)title
- {
- BOOL scrollSw;
- NXRect imageRect;
- static NXSize maxSize, scrSize = { 0.0, 0.0 };
-
- /* init max screen size */
- if (!scrSize.width) {
- [NXApp getScreenSize:&scrSize];
- maxSize.width = floor(scrSize.width * 0.80);
- maxSize.height = floor(scrSize.height * 0.80);
- }
-
- /* hide large panel and return if no image */
- [window orderOut:self];
- if (!theImage) return self;
-
- /* set panel image */
- [imageView setImage:theImage :fileName];
-
- /* fill popUp */
- id matrix = [imageMenu itemList];
- [[[matrix renewRows:0 cols:0] cellList] freeObjects];
- [imageMenu setItemList:matrix];
- for (int i = 0, cnt = [[theImage representationList] count]; i < cnt; i++) {
- id repId = [[theImage representationList] objectAt:i];
- int bits = [repId bitsPerSample] * [repId numColors];
- char desc[32];
- if (bits == NX_MATCHESDEVICE) strcpy(desc, "device");
- else sprintf(desc, "%d bit", bits);
- [[imageMenu addItem:desc] setTag:i];
- if (i == 0) [imagePopup setTitle:desc];
- }
-
- /* set image rep (best representation) */
- [self setImageRep:-1];
-
- /* resize panel */
- NXRect fRect, contentRect;
- [imageView getFrame:&imageRect];
- contentRect = imageRect;
- contentRect.X = contentRect.Y = 0.0;
- contentRect.H += controlHeight;
- if (contentRect.W < minContentSize.width ) contentRect.W = minContentSize.width ;
- if (contentRect.H < minContentSize.height) contentRect.H = minContentSize.height;
- [Window getFrameRect:&fRect forContentRect:&contentRect style:[window style]];
- if ((fRect.W >= scrSize.width) || (fRect.H >= scrSize.height)) {
- fRect.size = maxSize;
- [self windowWillResize:window toSize:&(fRect.size)];
- [Window getContentRect:&contentRect forFrameRect:&fRect style:[window style]];
- scrollSw = YES;
- } else {
- scrollSw = NO;
- }
- [imageScroller setHorizScrollerRequired:scrollSw];
- [imageScroller setVertScrollerRequired:scrollSw];
- [window sizeWindow:contentRect.W :contentRect.H];
-
- /* resize imageView */
- NXRect rect, scrollRect;
- [imageScroller getFrame:&scrollRect];
- [ScrollView getContentSize:&(rect.size) forFrameSize:&(scrollRect.size)
- horizScroller:scrollSw vertScroller:scrollSw borderType:[imageScroller borderType]];
- if (imageRect.W < rect.W) imageRect.W = rect.W;
- if (imageRect.H < rect.H) imageRect.H = rect.H;
- [imageView setFrame:&imageRect];
-
- /* show enlarged image */
- [window setTitle:title];
- [[[window center] display] makeKeyAndOrderFront:self];
-
- return self;
- }
-
- /* set image rep */
- - setImageRep:(int)repNum
- {
- id menuList = [imageMenu itemList];
- if (repNum < 0) repNum = [imageView bestRepIndex];
- if (![menuList selectCellWithTag:repNum]) return (id)nil;
- [imagePopup setTitle:[[menuList selectedCell] title]];
- [useAlphaSw setEnabled:[imageView imageRepHasAlpha:repNum]];
- [imageView setImageRep:repNum withAlpha:([useAlphaSw intValue]?YES:NO)];
- [imageView display];
- return self;
- }
-
- /* image popup menu action (may be caled by non matrix) */
- - selectImageRep:sender
- {
- id cellId = [[imageMenu itemList] selectedCell];
- [self setImageRep:[cellId tag]];
- return self;
- }
-
- // -------------------------------------------------------------------------------------
- // hide panel
-
- /* order out */
- - orderOut:sender
- {
- return [self clearImage];
- }
-
- // -------------------------------------------------------------------------------------
- // expanded image window delegate methods
-
- /* window is resizing */
- - windowWillResize:windowId toSize:(NXSize*)newSize
- {
-
- /* maximum content size */
- NXRect contentRect, imageRect;
- NXSize imageSize;
- [imageView getFrame:&imageRect];
- [[imageView image] getSize:&imageSize];
- [ScrollView getFrameSize:&contentRect.size forContentSize:&imageSize
- horizScroller:YES vertScroller:YES borderType:[imageScroller borderType]];
- contentRect.X = contentRect.Y = 0.0;
- contentRect.H += controlHeight;
-
- /* maximum window size */
- NXRect maxRect;
- [Window getFrameRect:&maxRect forContentRect:&contentRect style:[windowId style]];
- if (newSize->width > maxRect.W) newSize->width = maxRect.W;
- if (newSize->height > maxRect.H) newSize->height = maxRect.H;
-
- /* minimum window size */
- if (newSize->width < minWindowSize.width ) newSize->width = minWindowSize.width ;
- if (newSize->height < minWindowSize.height) newSize->height = minWindowSize.height;
-
- return self;
- }
-
- /* window is resizing */
- - windowDidResize:windowId
- {
-
- /* put scrollers in scroll view */
- [imageScroller setHorizScrollerRequired:YES];
- [imageScroller setVertScrollerRequired:YES];
-
- /* resize imageView */
- NXSize imageSize;
- NXRect rect, scrollRect, imageRect;
- [imageScroller getFrame:&scrollRect];
- [ScrollView getContentSize:&(rect.size) forFrameSize:&(scrollRect.size)
- horizScroller:YES vertScroller:YES borderType:[imageScroller borderType]];
- [[imageView image] getSize:&imageSize];
- [imageView getFrame:&imageRect];
- if (imageRect.W > imageSize.width ) imageRect.W = imageSize.width ;
- if (imageRect.H > imageSize.height) imageRect.H = imageSize.height;
- if (imageRect.W < rect.W ) imageRect.W = rect.W;
- if (imageRect.H < rect.H ) imageRect.H = rect.H;
- [imageView setFrame:&imageRect];
-
- return self;
- }
-
- @end
-